gdk: Explicitly create a cairo context inside GdkDrawingContext
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 7 Jun 2016 15:52:50 +0000 (16:52 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Thu, 9 Jun 2016 16:45:40 +0000 (17:45 +0100)
Instead of using gdk_cairo_create(), which we'll soon deprecate.

https://bugzilla.gnome.org/show_bug.cgi?id=766675

gdk/gdkdrawingcontext.c
gdk/gdkinternals.h
gdk/gdkwindow.c

index 6216bab20ee51f39af6315870f470f8b1e31a222..89d9b500b1974de363856c692908333a0a2475db 100644 (file)
@@ -231,12 +231,21 @@ gdk_drawing_context_get_cairo_context (GdkDrawingContext *context)
 
   if (context->cr == NULL)
     {
-      context->cr = gdk_cairo_create (context->window);
+      cairo_region_t *region;
+      cairo_surface_t *surface;
+
+      surface = _gdk_window_ref_cairo_surface (context->window);
+      context->cr = cairo_create (surface);
 
       gdk_cairo_set_drawing_context (context->cr, context);
 
-      gdk_cairo_region (context->cr, context->clip);
+      region = gdk_window_get_current_paint_region (context->window);
+      cairo_region_union (region, context->clip);
+      gdk_cairo_region (context->cr, region);
       cairo_clip (context->cr);
+
+      cairo_region_destroy (region);
+      cairo_surface_destroy (surface);
     }
 
   return context->cr;
index 1e7bcb0ad5b3f480eecf395097fcca1797534eeb..255557f53ef58d35ae7acec9f337382b48e27401 100644 (file)
@@ -472,6 +472,8 @@ void gdk_window_get_unscaled_size (GdkWindow *window,
 
 GdkDrawingContext *gdk_window_get_drawing_context (GdkWindow *window);
 
+cairo_region_t *gdk_window_get_current_paint_region (GdkWindow *window);
+
 void       _gdk_window_process_updates_recurse (GdkWindow *window,
                                                 cairo_region_t *expose_region);
 
index c9f043df924f842632b542240c7512be08e9bb45..f5503e8668edd83b135901cc10e939aeb375ea61 100644 (file)
@@ -3235,6 +3235,32 @@ gdk_window_end_draw_frame (GdkWindow         *window,
   window->drawing_context = NULL;
 }
 
+/*< private >
+ * gdk_window_get_current_paint_region:
+ * @window: a #GdkWindow
+ *
+ * Retrieves a copy of the current paint region.
+ *
+ * Returns: (transfer full): a Cairo region
+ */
+cairo_region_t *
+gdk_window_get_current_paint_region (GdkWindow *window)
+{
+  cairo_region_t *region;
+
+  if (window->impl_window->current_paint.region != NULL)
+    {
+      region = cairo_region_copy (window->impl_window->current_paint.region);
+      cairo_region_translate (region, -window->abs_x, -window->abs_y);
+    }
+  else
+    {
+      region = cairo_region_copy (window->clip_region);
+    }
+
+  return region;
+}
+
 /*< private >
  * gdk_window_get_drawing_context:
  * @window: a #GdkWindow